package com.qf.kele02.service.impl;
import cn.hutool.crypto.digest.DigestUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.qf.kele02.dao.UserDao;
import com.qf.kele02.entity.User;
import com.qf.kele02.service.UserSevice;
import com.qf.kele02.utils.Constants;
import com.qf.kele02.vo.ResultVo;
import com.qf.kele02.vo.TableVo;
import com.qf.kele02.vo.UserVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.util.*;

/**
 * @Author: 可乐
 * @Description:
 * @CreateTime: 2022-10-22  08:49
 */
@Service
@Slf4j
public class UserServicePlusImp extends ServiceImpl< UserDao,User > implements UserSevice {
	@Autowired
	UserDao userDao;

	@Override
	public User getUser( Integer id ) {
		return userDao.selectById( id );
	}

	/**
	 * 检验用户名和密码是否正确 ，如果正确，返回user对象 ，如果错误，返回null
	 *
	 * @param username
	 * @param password
	 * @return
	 */
	@Override
	public User login( String username,String password ) {
		Map< String, Object > map=new HashMap<>( );
		map.put( "name",username );
		//我没有加密肯定不好使
		String md5Password=DigestUtil.md5Hex( password );
		map.put( "password",md5Password );
		List< User > users=userDao.selectByMap(map );
		for(User user: users) {
			return user;
		}
		return null;
	}

	/**
	 * 用户注册方法
	 *
	 * @param userVo   包含了上传的文件
	 * @param realPath 头像文件存放的物理路径
	 * @return
	 */
	@Override
	public ResultVo regist( UserVo userVo,String realPath ) throws IOException {
		log.debug( "开始保存头像文" );
		final MultipartFile file1=userVo.getFile1( );
		//1. 生成一个唯一的文件名 ： 唯一前缀 + 原始文件名
		final String prefix=UUID.randomUUID( ).toString( );

		final String originalFilename=file1.getOriginalFilename( );
		final String extension=FilenameUtils.getExtension( originalFilename );
		final String finalFileName=prefix+"."+extension;

		final String finalFilePath=realPath+File.separator+finalFileName;

		// 判断 realPath 对应的目录是否存在，如果不存在则创建
		final File dir=new File( realPath );
		if(!dir.exists( )) {
			dir.mkdirs( );
		}

		// 存文件
		file1.transferTo( new File( finalFilePath ) );
		log.debug( "保存头像文件成功:finalFilePath={}",finalFilePath );

		log.debug( "保存用户的注册信息到数据库中" );
		// userVo  ----- >  user
		final User user=new User( );

		// 从一个对象中拷贝相同属性到另一个对象中
		BeanUtils.copyProperties( userVo,user );


		// 补全剩下的属性
		user.setName( userVo.getUsername( ) );
		user.setRegistTime( new Date( ) );
		user.setPhotopath( finalFileName );

		// 处理密码加密
//        user.setPassword();
		final String md5password=DigestUtil.md5Hex( userVo.getPassword( ) );
		user.setPassword( md5password );
		log.debug( "保存的用户信息为:user={}",user );
		userDao.insert( user );
		log.debug( "保存用户成功" );
		return new ResultVo( Constants.SUCCESS_CODE,"注册用户成功" );

	}

	/**
	 * 检查用户名是否存在
	 *
	 * @param username
	 * @return
	 */
	@Override
	public ResultVo checkUsername( String username ) {
		QueryWrapper< User > queryWrapper=new QueryWrapper<>( );
		queryWrapper.eq( "name",username );

		List< User > users=userDao.selectList( queryWrapper );
		for(User user: users) {
			if(user==null) {
				// 用户名不存在
				return new ResultVo( Constants.SUCCESS_CODE,"用户名不存在" );
			}else {
				return new ResultVo( Constants.FAIL_CODE,"用户名已经存在了" );
			}
		}

	return null;

	}

	/**
	 * 分页查询用户数据
	 *
	 * @param page  页号
	 * @param limit 页大小
	 * @return
	 */
	@Override
	public TableVo getAllUserByPage( Integer page,Integer limit ) {
		return null;
	}

	/**
	 * 拦截中使用的还原用户登录状态的方法
	 *
	 * @param username
	 * @param md5password
	 * @return
	 */
	@Override
	public User restoreUser( String username,String md5password ) {
		log.debug( "userservice查询用户收到的参数为username={},md5password={}",username,md5password );
		QueryWrapper< User > queryWrapper=new QueryWrapper<>( );
		queryWrapper.eq( "name",username );

		List< User > users=userDao.selectList( queryWrapper );
		for(User user: users) {
			if(user==null) {
				return null;
			}

			//2. 比对数据库中的密码和登录表单中传递的密码是否一致

			if(md5password.equals( user.getPassword( ) )) {
				return user;
			}else {
				return null;
			}
		}

	return null;

	}

	/**
	 * 使用分页插件
	 *
	 * @param page
	 * @param limit
	 * @return
	 */
	@Override
	public TableVo getUserByPagehelper( Integer page,Integer limit ) {
		return null;
	}

	/**
	 * 添加用户
	 *
	 * @param user
	 * @return
	 */
	@Override
	public ResultVo addUser( User user ) {
		return null;
	}

	/**
	 * 根据id删除用户
	 *
	 * @param ids
	 * @return
	 */
	@Override
	public ResultVo deleteUserByIds( List< Integer > ids ) {
		return null;
	}

	/**
	 * 修改用户
	 *
	 * @param user
	 * @return
	 */
	@Override
	public ResultVo updateUser( User user ) {
		return null;
	}

	/**
	 * 带有条件的分页查询
	 *
	 * @param page
	 * @param limit
	 * @param userVo
	 * @return
	 */
	@Override
	public TableVo< User > getUsersByContdition( Integer page,Integer limit,UserVo userVo ) {
		QueryWrapper queryWrapper=new QueryWrapper<User>(  );
		PageHelper.startPage( page,limit );
		List< User > data=userDao.selectList( queryWrapper );
		final PageInfo< User > pageInfo=new PageInfo<>( data );
		final long total=pageInfo.getTotal( );
		return TableVo.ok( (int) total,data );

	}

	@Override
	public String export( ) throws IllegalAccessException, ClassNotFoundException {
		return null;
	}

	@Override
	public TableVo< User > insert( MultipartFile source ) throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException, ParseException {
		return null;
	}

	@Override
	public ResultVo deleteHead( ) {
		return null;
	}

}
